package com.dubbo.test.redisNew;

import com.dubbo.test.lock.JedisConnectionUtils;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Pipeline;

/**
 * @ Author xsd
 * @ crate time 2020/7/23 14:37
 * @ 描述 redis管道__批量操作，减少网络IO
 * zj: 开启      jedis.pipelined()
 *     批量提交   pipeline.sync()
 *     增加操作   pipeline.incr
 */
public class RedisPipeline {

    static Jedis jedis = JedisConnectionUtils.getJedis();
    /**
     * 单条插入
     * Redis Incr 命令将 key 中储存的数字值增一。
     * 如果 key 不存在，那么 key 的值会先被初始化为 0 ，然后再执行 INCR 操作
     */
    private static void withoutPipeline() {
        try {
            for (int i = 0; i < 10000; i++) {
                jedis.incr("test_1");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            jedis.close();
        }
    }

    /**
     * 使用管道
     */
    private static void usePipeline() {
        try {
            Pipeline pipeline = jedis.pipelined();
            for (int i = 0; i < 10000; i++) {
                pipeline.incr("test_2");
            }
            pipeline.sync();

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            jedis.close();
        }
    }

    public static void main1(String[] args) {
        // Redis的管道技术指在服务端未响应时，客户端可以继续向服务端发送请求
        // 并最终一次性读取所有服务端的响应。
        // 交互次数减少_客户端的请求批量发送给服务器，服务器针对批量数据分别查询并统一回复，能显著提高Redis的性能
//        long start = System.currentTimeMillis();
//        usePipeline();
//        long end = System.currentTimeMillis();
//        System.out.println("usePipeline--》:"+(end - start));
//
//        start = System.currentTimeMillis();
//        withoutPipeline();
//        end = System.currentTimeMillis();
//        System.out.println("withoutPipeline--》:"+(end - start));
        jedis.incr("balance");
    }
}
